#include "saisie.h"

list_lettre * nom ;
char * nom_fichier ;
fenetre * fenetre_saisie ;
int indice_curseur = 0, fin_saisie = 1;
SDL_Surface * print_mes, * screen_saisie;
SDL_Rect * pos_mes ;
TTF_Font * police_saisie ;

list_lettre * creat_list_lettre()
{
    list_lettre* new = (list_lettre*) malloc(sizeof(list_lettre));
    new->longueur = 0;
    new->premiere = NULL;
    new->derniere = NULL;
    return new;
}

fenetre* creat_fenetre(int x,int y,int h,int w)
{
    fenetre* new = (fenetre*) malloc(sizeof(fenetre));
    SDL_Rect * position = (SDL_Rect *) malloc(sizeof(SDL_Rect)) ;
    new->position = position ;
    new->position->h = h;
    new->position->w = w;
    new->position->x = x;
    new->position->y = y;
    new->text = creat_list_lettre();
    new->true_text = NULL;
    new->zone_texte = NULL;
    return new;

}

void add_lettre(char c, int pos, list_lettre *l)
{
    lettre* new = (lettre*)malloc(sizeof(lettre));
    new->l = c;
    new->suivant = NULL;
    new->precedent = NULL;
    if (pos == 0) {
        if( l->premiere == NULL ){
            l->premiere = new;
            l->derniere = new;
        }else{
            l->premiere->precedent = new;
            new->suivant = l->premiere;
            l->premiere = new;
        }
        l->longueur += 1;
    } else {
        lettre * temp = l->premiere ;
        while (pos > 1) {
            temp = temp->suivant ;
            pos-- ;
        }
        new->precedent = temp;
        new->suivant = temp->suivant;
        temp->suivant = new;
        if (new->suivant == NULL) {
            l->derniere = new ;
        }
        l->longueur += 1;
    }
}

void supp_lettre(int pos, list_lettre *l)
{
    if(l->longueur > 1){
        lettre * temp = l->premiere ;
        while (pos != 0) {
            temp = temp->suivant ;
            pos-- ;
        }
        if(temp->precedent) {
            temp->precedent->suivant = temp->suivant ;
        } else {
            l->premiere = temp->suivant ;
        }
        if (temp->suivant) {
            temp->suivant->precedent = temp->precedent ;
        } else {
            l->derniere = temp->precedent;
        }
        free(temp);
        l->longueur -= 1;
    }else if(l->longueur == 1){
        free(l->premiere);
        l->derniere = NULL;
        l->premiere = NULL;
        l->longueur -= 1;
    }
}

void supp_list_lettre (list_lettre * l)
{
    lettre * tampon ;
    if (l) {
        if (l->premiere) {
            while (l->premiere) {
                tampon = l->premiere->suivant ;
                free(l->premiere) ;
                l->premiere = tampon ;
            }
        }
    }
    free(l) ;
}

void supp_fenetre (fenetre * f)
{
    if (f) {
        free(f->position) ;
        supp_list_lettre(f->text) ;
        free(f->true_text) ;
        supp_fenetre(f->zone_texte) ;
    }
    free(f) ;
}

char *convert_en_chaine(list_lettre*mot)
{
    char* new ;
    if (mot->premiere) {
        new =(char *)malloc((mot->longueur + 2) *sizeof(char));
        int i;
        lettre * lettre_mot = mot->premiere;
        for(i = 0; i < mot->longueur + 1 ; i++){
            if (i == indice_curseur && i != 0) {
                new[i] = ' ' ;
            } else {
                if (lettre_mot) {
                    new[i] = lettre_mot ->l;
                    lettre_mot  = lettre_mot ->suivant;
                }
            }
        }
        if (indice_curseur == 0 || indice_curseur == i - 1) {
            new [i - 1] = '\0' ;
        } else {
            new[i] = '\0' ;
        }
        new[0] = new[0]-32;
    } else {
        new =(char *)malloc(5 *sizeof(char) );
        strcpy(new,"Yolo") ;
    }

    return new;
}

void HandleEventInSaisie(SDL_Event event, SDL_Surface * screen)
{
    switch (event.type) {
    case SDL_KEYDOWN:
        switch(event.key.keysym.sym) {

            case SDLK_RIGHT:
                if (indice_curseur < nom->longueur) {
                    indice_curseur++ ;
                    fenetre_saisie->zone_texte->true_text = convert_en_chaine(nom) ;
                }
                break;

            case SDLK_LEFT:
                if (indice_curseur > 0) {
                    indice_curseur-- ;
                    fenetre_saisie->zone_texte->true_text = convert_en_chaine(nom) ;
                }
                break;

            case SDLK_BACKSPACE:
                    if (indice_curseur != 0) {
                        supp_lettre(indice_curseur - 1, nom) ;
                        indice_curseur-- ;
                        if (fenetre_saisie->zone_texte) {
                            fenetre_saisie->zone_texte->true_text = convert_en_chaine(nom) ;
                        }
                    }
                    break;

            case SDLK_RETURN:
                fin_saisie= 0;
                break;

            default:
                if (event.key.keysym.unicode >= 97 && event.key.keysym.unicode <= 123) {
                    if (nom->longueur < 20) {
                        char lettre = (char) event.key.keysym.unicode ;
                        add_lettre(lettre, indice_curseur, nom) ;
                        indice_curseur++ ;
                        if (fenetre_saisie->zone_texte) {
                            fenetre_saisie->zone_texte->true_text = convert_en_chaine(nom) ;
                        }
                    }
                }
                break;
        }
        break;

    case SDL_MOUSEBUTTONDOWN:
        switch (event.button.button) {

        case SDL_BUTTON_LEFT:
                // Selection curseur
            break;


        break;
        }
    }
}

char * lancer_saisie(SDL_Surface * screen, char * chemin_niveau)
{
    int bon_nom = 0 ;
    char * chemin_fichier = NULL;
    FILE * fichier_test = NULL ;
    SDL_EnableUNICODE(1);
    SDL_Event event ;
    fenetre_saisie = creat_fenetre(200, 200, 600, 1100) ;
    fenetre_saisie->true_text = (char *) malloc (sizeof(char) * 20) ;
    strcpy(fenetre_saisie->true_text, "Saisie du texte") ;
    fenetre_saisie->zone_texte = creat_fenetre(350, 500, 150, 500) ;
    nom = creat_list_lettre() ;
    fenetre_saisie->zone_texte->text = nom;
    fenetre_saisie->zone_texte->true_text = nom_fichier;
    police_saisie = TTF_OpenFont("yoshisst.ttf", 50);
    nom = creat_list_lettre() ;
    while (bon_nom == 0) {
        fin_saisie = 1;
        while (fin_saisie != 0) {
            dessiner_fenetre(screen, police_saisie, fenetre_saisie) ;
            SDL_UpdateRect(screen, 0, 0, 0, 0) ;
            SDL_WaitEvent(&event) ;
            HandleEventInSaisie(event, screen) ;
        }
        indice_curseur = 0;
        nom_fichier = convert_en_chaine(nom) ;
        chemin_fichier = (char *) malloc (sizeof(char) * (strlen(chemin_niveau) + strlen(nom_fichier)) ) ;
        strcpy(chemin_fichier, chemin_niveau) ;
        chemin_fichier[strlen(chemin_fichier) - 18] = '\0' ;
        strcat(chemin_fichier, nom_fichier) ;
        strcat(chemin_fichier, ".txt") ;
        fichier_test = fopen(chemin_fichier, "r") ;
        if (fichier_test == NULL) {
            bon_nom = 1;
        } else {
            strcpy(fenetre_saisie->true_text, "Erreur, nom deja pris.") ;
            dessiner_fenetre(screen, police_saisie, fenetre_saisie) ;
            SDL_UpdateRect(screen, 0, 0, 0, 0) ;
            free(chemin_fichier) ;
            chemin_fichier = NULL;
            SDL_Delay(1000) ;
            strcpy(fenetre_saisie->true_text, "Saisie du texte") ;
            fclose(fichier_test) ;
        }
    }
    supp_fenetre(fenetre_saisie) ;
    free(police_saisie) ;
    return chemin_fichier;
}

